<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>闭包和引用</title>
    <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
    <script type="text/javascript">
        $(function () {
//            var foo = Counter(4);
//            console.log(foo.get());
//            foo.increment();
//            console.log(foo.get());

//            wrongEg();
//            rightEg1();
//            rightEg2();

//            argumentFunc(1, 2, 3);

            useNamespace();
            console.log(add(3, 4));
        });

        /*
         * 模拟私有变量
         * */
        function Counter(start) {
            var count = start;
            return{
                increment: function () {
                    count++;
                },
                get: function () {
                    return count;
                }
            }
        }

        /*
         * 循环中的闭包
         * */
        function wrongEg() {
            for (var i = 0; i < 10; i++) {
                setTimeout(function () {
                    console.log(i);
                }, 1000);
            }
        }

        function rightEg1() {
            for (var i = 0; i < 10; i++) {
                (function (e) {
                    setTimeout(function () {
                        console.log(e);
                    }, 1000);
                })(i);
            }
        }

        function rightEg2() {
            for (var i = 0; i < 10; i++) {
                setTimeout((function (e) {
//                    return function () {
                    console.log(e);
//                    }
                })(i), 1000);
            }
        }


        /*
         * arguments对象
         * */
        function argumentFunc(a, b, c) {
            arguments[0] = 2;
            console.log(a);

//            b = 4;
            console.log(arguments[1]);

            var d = c;
            d = 9;
            console.log(d);
            console.log(c);
        }


        /*
         * 作用域与命名空间
         * */
        function useNamespace() {
            for (var i = 0; i < 10; i++) {
                // count
            }
            console.log(i);
        }

        function add(a, b) {
            //return a + b;
            //return不在同一行，会报错
            return
            a + b;
        }

        // 译者注：来自 Nettuts+ 的一段代码，生动的阐述了 JavaScript 中变量声明提升规则
        var myvar = 'my value';

        (function() {
            alert(myvar); // undefined
            var myvar = 'local value';
            alert(myvar); // local value
        })();   //自执行函数

        alert(myvar);

    </script>
</head>
<body>

</body>
</html>